#define _GNU_SOURCE
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>

//fmt前面没空格
#define LOG(fmt, ...)printf("[%s:%d:%.2f]" fmt,__FILE__,__LINE__,##__VA_ARGS__)
void PrintNum(int count,...)
{
    va_list ap;
    //第二个参数传可变参数列表前的最后一个参数
    va_start(ap,count);
    for(int i=0;i<count;i++)
    {
        int num=va_arg(ap,int);//修改ap指针来返回下一个参数
        printf("argument[%d]:%d\n",i,num);
    }
    va_end(ap);//将ap指针置为空
}

void MyPrintf(const char* fmt,...)
{
    va_list ap;
    va_start(ap,fmt);
    char* res;
    int ret = vasprintf(&res,fmt,ap);
    if(ret!=-1)
    {
        printf(res);
        // free(res);
    }
    
    va_end(ap);

    //多次使用必须重新初始化，否则会为空指针，不管上一次使用完后是否free
    // ret = vasprintf(&res,fmt,ap);
    // if(ret!=-1)
    // {
    //     printf(res);
    //     // free(res);
    // }
    
}
int main()
{
    //为了处理这种情况，需要在__VA_ARGS__前加两个##,转义多出来的逗号
    LOG("xiaowang\n",90.67);
    // LOG("%s-%d","xiaowang",111);
    PrintNum(5,1,2,3,4,5);
    //参数不匹配，第一个不匹配的会输出0，剩余的输出随机值
    // PrintNum(10,1,2,3,4);
    PrintNum(1,2);
    MyPrintf("%s:%d\n","nihao",1234);
    return 0;
}